package com.study.七大原则.o5开闭原则;

public class Ocp {

    public static void main(String[] args) {
        //使用看看存在的问题
        GraphicEditor graphicEditor = new GraphicEditor();
        graphicEditor.drawShape(new Rectangle());
        graphicEditor.drawShape(new Circle());
        graphicEditor.drawShape(new Triangle());
    }

    /**
     * 方式一的优缺点：
     *     1、有点事比较好理解，简单易操作
     *     2、缺点是违反了设计模式的ocp原则，即对扩展开放（提供方），对修改关闭（使用方）。即当我们给类增加新功能的时候，
     *     尽量不修改代码，或者尽量少修改代码。
     *     3、缺点：如果我们要新增一个图形种类三角形，我们需要做很多修改
     *     违背了ocp原则，修改了使用方的代码。
     */

    // 这是一个用于绘图的类[使用方]
    static class GraphicEditor {
        //接收Shape对象 ,然后根据type来绘制不同的图形
        public void drawShape(Shape s) {
            if (s.m_type == 1)
                drawRectangle(s);
            else if (s.m_type == 2)
                drawCircle(s);
            else if (s.m_type == 3)   //新增的判断，图形是否是三角形
                drawTriangle(s);
        }

        public void drawRectangle(Shape r) {
            System.out.println("绘制矩形");
        }

        public void drawCircle(Shape r) {
            System.out.println("绘制圆形");
        }

        //需要新增绘制三角形方法
        public void drawTriangle(Shape r) {
            System.out.println("绘制三角形");
        }
    }

    //Shape类，基类
   static class Shape {
       int m_type;
   }

   static class Rectangle extends Shape {

       public Rectangle() {
           super.m_type = 1;
       }
   }

   static class Circle extends Shape {

       public Circle() {
           super.m_type = 2;
       }
   }

   //新增的三角形
   static class Triangle extends Shape {

       public Triangle() {
           super.m_type = 3;
       }
   }
}
